define([
		'NumberInput'
	],function(
		NumberInput
	){
	var PageNumber=function (initConfig){
		var pageNumber=this;
		pageNumber.config={
			perpageNum:		$.getDefined(initConfig.perpage || 10),
			showPerpage:	$.getDefined(!!initConfig.perpage ,false)
		};

		pageNumber.$dom=$('<div class="pageNumberBox"></div>');

		pageNumber.$leftPart=$('<div class="leftPart"></div>').appendTo(pageNumber.$dom);
		pageNumber.$rightPart=$('<div class="rightPart"></div>').appendTo(pageNumber.$dom);


		pageNumber.$perpageInfo=$('<span class="perpageInfo"></span>').appendTo(pageNumber.$leftPart);
		pageNumber.perpageInput=new NumberInput({
			minValue:10,
			maxValue:50
		});
		pageNumber.perpageInput.value(pageNumber.config.perpageNum);
		pageNumber.perpageInput.$dom.appendTo(pageNumber.$perpageInfo);
		pageNumber.$perpageInfo.prepend('每页显示');
		pageNumber.$perpageInfo.append('条&nbsp;');
		pageNumber.$perpageBtn=$('<span class="btn btn-default">确定</span>').appendTo(pageNumber.$perpageInfo);


		pageNumber.$btnList=$('<ul class="pageBtnList"></ul>').appendTo(pageNumber.$rightPart);

		pageNumber.$pageJumpInfo=$('<span class="pageJumpInfo"></span>').appendTo(pageNumber.$rightPart);
		pageNumber.pageJumpInput=new NumberInput({
			minValue:1
		});
		pageNumber.pageJumpInput.$dom.appendTo(pageNumber.$pageJumpInfo);
		pageNumber.$pageJumpInfo.prepend('跳转至');
		pageNumber.$pageJumpInfo.append('&nbsp;');
		pageNumber.$pageJumpBtn=$('<span class="btn btn-default">确定</span>').appendTo(pageNumber.$pageJumpInfo);


		pageNumber.data={
			min:0,
			max:0,
			now:0
		};
		pageNumber.pageCallback=function(){};
		pageNumber.update=function(){
			if(pageNumber.config.showPerpage){
				pageNumber.$perpageInfo.show();
			}else{
				pageNumber.$perpageInfo.hide();
			}
			var btnArr=[];
			if(pageNumber.data.now>pageNumber.data.min){
				btnArr.push('prev');
			}
			btnArr.push(pageNumber.data.min);
			var nowBtnSiblingsRadius=2;
			function addSiblingsBtn(){
				var siblingsBtnArr=[];
				var minBtn=pageNumber.data.now-nowBtnSiblingsRadius;
				var maxBtn=pageNumber.data.now+nowBtnSiblingsRadius;
				var needNextEllipsis=false;
				if(minBtn<=pageNumber.data.min+1){
					minBtn=pageNumber.data.min+1;
					maxBtn=minBtn+nowBtnSiblingsRadius*2-1;
				}else{
					btnArr.push('...');
				}
				if(maxBtn>=pageNumber.data.max-1){
					maxBtn=pageNumber.data.max-1;
					minBtn=maxBtn-nowBtnSiblingsRadius*2+1;
				}else{
					needNextEllipsis=true;
				}
				if(minBtn<pageNumber.data.min+1){
					minBtn=pageNumber.data.min+1;
				}
				var pointerBtn=minBtn;
				for(;pointerBtn<=maxBtn;pointerBtn++){
					btnArr.push(pointerBtn);
				}
				if(needNextEllipsis){
					btnArr.push('...');
				}
			}
			addSiblingsBtn();
			if(pageNumber.data.max>pageNumber.data.min){
				btnArr.push(pageNumber.data.max);
			}
			if(pageNumber.data.now<pageNumber.data.max){
				btnArr.push('next');
			}

			pageNumber.$btnList.html('');
			$.each(btnArr, function(i,btnNum) {
				var $btn=$('<li class="pageBtn"></li>');
				var btnStr=btnNum;
				switch(btnStr){
					case '...':
						btnStr='...';
						break;
					case 'prev':
						btnStr='<';
						break;
					case 'next':
						btnStr='>';
						break;
					default:
						btnStr=btnStr+1;
				}
				$btn.text(btnStr).attr('data-value',btnNum);
				if(btnNum===pageNumber.data.now){
					$btn.addClass('checked');
				}
				$btn.appendTo(pageNumber.$btnList);
			});


			pageNumber.pageJumpInput.maxValue(pageNumber.data.max+1);
			pageNumber.pageJumpInput.value(pageNumber.data.now+1);
		}
		pageNumber.goto=function(pageNum){
			switch(pageNum){
				case 'prev':
					pageNumber.data.now--;
					break;
				case 'next':
					pageNumber.data.now++;
					break;
				default:
					pageNumber.data.now=pageNum;
			}

			if(pageNumber.pageCallback(pageNumber.data.now)!==false){
				pageNumber.update();
			}

		}
		pageNumber.$dom.on('click','.pageBtn',function(){
			var $pageBtn=$(this);
			if($pageBtn.hasClass('checked')){
				return false;
			}
			var pageStr=$pageBtn.attr('data-value');
			switch(pageStr){
				case '...':
					return false;
					break;
				case 'prev':
				case 'next':
					pageNumber.goto(pageStr);
					break;
				default:
					pageNumber.goto($.parseInt(pageStr));
			}
		});
		pageNumber.pageJumpInput.$input.on('keyup',function(e){
			if(e.keyCode===13){
				pageNumber.goto(pageNumber.pageJumpInput.value()-1);
			}
		});
		pageNumber.$pageJumpBtn.on('click',function(){
			pageNumber.goto(pageNumber.pageJumpInput.value()-1);
		});

		pageNumber.status=function(numType,numValue){
			switch(numType){
				case 'min':
				case 'max':
				case 'now':
					if(numValue!==undefined){
						pageNumber.data[numType]=numValue;
						pageNumber.update();
					}else{
						return pageNumber.data[numType];
					}
					break;
			}
		}
	}
	window.PageNumber=PageNumber;
	return PageNumber;
})
